package com.chat.client.control;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.StringTokenizer;

import android.os.Handler;
import android.os.Message;
import android.util.Log;

// 서버에 연결된 상태에서 서버로 부터 실시간 전송되는
// 메시지를 수신하여 화면에 출력
public class ChatListener extends Thread implements IChatProtocal {
	
	public static final String TAG = ChatListener.class.getSimpleName();
	private Socket socket;
	private BufferedReader in;
	private Handler handler;
	private int protocalType;
	
	public ChatListener(Socket socket, Handler handler) throws IOException{
		this.socket = socket;
		this.handler = handler;
		in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
	}
	
	public void run(){
		while(socket.isConnected()){
			try {
				String serverMessage = in.readLine();
				Log.d(TAG,"서버로부터의  통메시지 : " + serverMessage);
				StringTokenizer st = new StringTokenizer(serverMessage, "||");
				
				protocalType = Integer.parseInt(st.nextToken());
				String nickName = null;
				
				// 프로토콜 별 분기
				switch (protocalType) {
					// 입장메시지
					case CHAT_TYPE_ENTER:
						 nickName = st.nextToken();
						// 메시지창 접속클라이언트의 입장을 출력
						appendMessage("★★★ ["+nickName+"]님이 대기실에 입장하였습니다 ★★★");
						break;
					
					// 사용자 리스트
					case CHAT_TYPE_USER_LIST:
						String clients = st.nextToken();
						String[] clientList = clients.split("/");
						// 리스트창에 접속클라이언트 리스트 출력
						chatList(clientList);
						break;
						
					// 개설방 리스트
					case CHAT_TYPE_ROOM_LIST:
						String rooms = st.nextToken();
						String[] roomList = rooms.split("/");
						// 방리스트 출력
						chatRoomList(roomList);
						Log.d(TAG,"개설된 방:" + roomList);
						break;
						
					case CHAT_TYPE_OUT:
						nickName = st.nextToken();
						// 메시지창과 리스트창에 접속클라이언트의 퇴장을 출력
						appendMessage("＠＠＠ ["+nickName+"]님이 대기실에서 퇴장하였습니다 ＠＠＠");
						removeChatList(nickName);
						break;
					
					// 채팅메시지
					case CHAT_TYPE_CHAT:
						nickName = st.nextToken();
						String chatMessage = st.nextToken();
						appendMessage("["+nickName+"] : "+ chatMessage);
						
						break;
					// 쪽지메시지
					case CHAT_TYPE_GWIT:
						nickName = st.nextToken();
						String receiveNickName = st.nextToken();
						String receiveMessage = st.nextToken();
						appendMessage("["+nickName+"] 님의 쪽지:  "+ receiveMessage);
						break;
				}				
			
			} catch (IOException e) {}			
		}
	}
	
	// 핸들러로 메시지 보내기
	public void appendMessage(String message) {
		Message msg = new Message();
		msg.what = MESSAGE_TYPE_CHAT;
		msg.obj = message;
		handler.sendMessage(msg);
	}
	
	public void chatList(String[] chatList) {
		
	}
	
	public void removeChatList(String nicName) {
		
	}
	
	public void chatRoomList(String[] roomList) {
		
	}
	
	public void removeChatRoomList(String roomName) {
		
	}
}
